package 案例;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

//通过这些文件操作,在指定目录中按照文件内容查找,看看是否包含匹配的结果
public class Test3 {
    public static void main(String[] args) throws IOException {
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入根目录:(绝对路径)");
        String root = scan.next();
        System.out.println("请输入你想要查找的内容:>");
        String content = scan.next();
        File rootFile = new File(root);
        List<File> lists = new ArrayList<>();
        //递归遍历目录里的文件
        sanDir(rootFile,content,lists);
        //打印结果
        for (File f:lists){
            System.out.println(f.getCanonicalPath());
        }
    }

    private static void sanDir(File rootFile, String content, List<File> lists) {
        File[] files = rootFile.listFiles();
        if(files == null||files.length == 0){
            //如果files为空,说明是普通文件,如果files为0,说明虽然是目录文件,但是没有内容了.
            return;
        }
        for (File f:files){
            //如果是目录文件,则继续递归
            if(f.isDirectory()){
                sanDir(f,content,lists);
                continue;
            }
            //如果是普通文件,则查找是否有符合的内容
            if(f.getName().contains(content)){
              //看看文件名称中是否包含
                lists.add(f);

            }else{
                //看看文件内容中是否包含
                boolean b = findContent(f,content);
                if(b){
                    lists.add(f);
                }
            }
        }

    }

    private static boolean findContent(File file, String content) {
        //打开文件,进行读取.依次取出每一行结果
        StringBuilder sb = new StringBuilder();
        try(InputStream inputStream = new FileInputStream(file);Scanner scanner = new Scanner(inputStream,"UTF-8")){
            while(scanner.hasNextLine()){
                sb.append(scanner.nextLine());
                //或者是
                /**
                 *  String line = scanner.nextLine();
                 *  sb.append(line+"\n");//需要加个换行符
                 */
            }
        }catch (IOException e){
            e.printStackTrace();
        }
        String s = sb.toString();
        if(s.contains(content)){
            return true;
        }
        return false;
        //只要结果不等于-1,就说明查到了
        //return sb.indexOf(content) != -1;
    }
    //nextLine():每次读取的时候,都是找到了换行符才算读取完毕.
    //next():一次读一块字符串,每次读到空白符都算读取完毕.
    //空白符包括不限于换行,空格,水平制表符,翻页符

}
